/**
 * 本地文件存储工具
 * 
 * 用于将服务配置信息保存到项目内的JSON文件
 */

import type { Service } from '../stores/services';

// 配置文件路径
const CONFIG_FILE_PATH = '/src/resources/config.json';

// 默认的空配置
const DEFAULT_CONFIG: Service[] = [];

/**
 * 将数据保存到本地JSON文件（通过浏览器下载功能）
 * 
 * 注意：在纯前端环境中，我们无法直接写入项目文件
 * 这个方法会提供配置文件下载，用户需手动替换项目中的config.json
 * 
 * @param data 要保存的数据
 * @returns 是否保存成功
 */
export const saveToFile = <T>(data: T): boolean => {
  try {
    // 创建一个Blob对象，用于保存JSON数据
    const jsonData = JSON.stringify(data, null, 2);
    const blob = new Blob([jsonData], { type: 'application/json' });
    
    // 创建下载链接
    const downloadLink = document.createElement('a');
    downloadLink.href = URL.createObjectURL(blob);
    downloadLink.download = 'config.json';
    
    // 触发下载
    document.body.appendChild(downloadLink);
    downloadLink.click();
    document.body.removeChild(downloadLink);
    
    console.log('配置文件已准备好下载，请手动替换 src/resources/config.json');
    return true;
  } catch (error) {
    console.error('准备下载配置文件失败:', error);
    return false;
  }
};

/**
 * 从项目内的JSON文件加载数据
 * @returns Promise<T | null> 加载的数据，如果加载失败则返回null
 */
export const loadFromFile = <T>(): Promise<T | null> => {
  return new Promise((resolve) => {
    try {
      // 使用fetch API 获取项目内的配置文件
      fetch(CONFIG_FILE_PATH)
        .then(response => {
          if (!response.ok) {
            throw new Error(`配置文件加载失败: ${response.status}`);
          }
          return response.json();
        })
        .then(data => {
          resolve(data as T);
        })
        .catch(error => {
          console.error('加载配置文件失败:', error);
          
          // 如果无法加载，尝试从localStorage恢复
          try {
            const savedData = localStorage.getItem('services');
            if (savedData) {
              const parsedData = JSON.parse(savedData) as T;
              console.log('从localStorage恢复配置数据');
              resolve(parsedData);
              return;
            }
          } catch (e) {
            console.error('从localStorage恢复失败', e);
          }
          
          // 使用默认空配置
          resolve(DEFAULT_CONFIG as unknown as T);
        });
    } catch (error) {
      console.error('加载配置文件失败:', error);
      resolve(null);
    }
  });
};

/**
 * 用户可以上传配置文件
 * 此方法允许用户选择一个本地JSON文件上传
 * @returns Promise<T | null> 上传的数据，如果上传失败则返回null
 */
export const uploadConfigFile = <T>(): Promise<T | null> => {
  return new Promise((resolve) => {
    try {
      // 创建文件输入元素
      const fileInput = document.createElement('input');
      fileInput.type = 'file';
      fileInput.accept = 'application/json';
      
      // 处理文件选择事件
      fileInput.onchange = (event) => {
        const target = event.target as HTMLInputElement;
        const file = target.files?.[0];
        
        if (!file) {
          resolve(null);
          return;
        }
        
        const reader = new FileReader();
        reader.onload = (e) => {
          try {
            const content = e.target?.result as string;
            const data = JSON.parse(content) as T;
            resolve(data);
          } catch (error) {
            console.error('解析JSON数据失败:', error);
            resolve(null);
          }
        };
        
        reader.onerror = () => {
          console.error('读取文件失败');
          resolve(null);
        };
        
        reader.readAsText(file);
      };
      
      // 触发文件选择
      document.body.appendChild(fileInput);
      fileInput.click();
      document.body.removeChild(fileInput);
    } catch (error) {
      console.error('加载文件失败:', error);
      resolve(null);
    }
  });
};

/**
 * 检查是否支持文件操作
 * @returns 是否支持
 */
export const isFileSystemSupported = (): boolean => {
  return true;
}; 